home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / gprim / discgrp / dhpoint3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-19  |  2.0 KB  |  100 lines

  1. #include <stdio.h>
  2. #include "vec4.h" 
  3. #include "dgflag.h"
  4. #include "math.h"
  5.  
  6. double 
  7. DHPt3Dot(point4 v0, point4 v1, int metric)
  8. {
  9.     switch (metric)    {
  10.     case DG_EUCLIDEAN:
  11.         return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]);
  12.         break;
  13.     case DG_HYPERBOLIC:
  14.         return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]);
  15.         break;
  16.     case DG_SPHERICAL:
  17.         return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]);
  18.         break;
  19.     }
  20. }
  21.  
  22. double 
  23. DHPt3Dot3(point4 v0, point4 v1, int metric)
  24. {
  25.     switch (metric)    {
  26.     case DG_EUCLIDEAN:
  27.         return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]);
  28.         break;
  29.     case DG_HYPERBOLIC:
  30.         return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3]);
  31.         break;
  32.     case DG_SPHERICAL:
  33.         return(v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3]);
  34.         break;
  35.     }
  36. }
  37.  
  38. double
  39. DHPt3Distance(point4 p0, point4 p1, int metric)
  40. {
  41.     double d0, d1;
  42.     point4 diff;
  43.     switch (metric)    {
  44.     case DG_EUCLIDEAN:
  45.         VSUB3(p0,p1, diff);
  46.         return(MAGNITUDE3(diff));
  47.         break;
  48.     case DG_HYPERBOLIC:
  49.         d0 =INPRO31(p0, p0);
  50.         d1 =INPRO31(p1, p1);
  51.         if (d0 >= 0.0 || d1 >= 0.0)    {
  52.         fprintf(stderr,"Invalid points in dist_proj3\n");
  53.         return(0.0);
  54.         }
  55.         return(acosh( ABS( INPRO31(p0, p1) / sqrt(d0 * d1))));
  56.         break;
  57.     case DG_SPHERICAL:
  58.         d0 =INPRO31(p0, p0);
  59.         d1 =INPRO31(p1, p1);
  60.         return(acos( ABS( INPRO4(p0, p1) / sqrt(d0 * d1))));
  61.         break;
  62.  
  63.     }
  64. }
  65.  
  66. void
  67. DHPt3PerpBisect(point4 p0, point4 p1, point4 result, int metric)
  68. {
  69.     switch (metric)    {
  70.       case  DG_EUCLIDEAN:
  71.     {
  72.     point4 tmp;
  73.     double t;
  74.     VSUB3(p1, p0, result)
  75.     VADD3(p0, p1, tmp)
  76.     VSCALE3(tmp, .5, tmp)
  77.     result[3] = -(VDOT3(tmp, result));
  78.     }
  79.     break;
  80.  
  81.       case DG_HYPERBOLIC:
  82.     NORMALIZE31(p0);
  83.     NORMALIZE31(p1);
  84.     VSUB4(p0, p1, result)
  85.     if (INPRO31(p0, result) > 0.0)    VSCALE4(result, -1, result)
  86.     break;
  87.  
  88.       case DG_SPHERICAL:
  89.     NORMALIZE4(p0);
  90.     NORMALIZE4(p1);
  91.     VSUB4(p0, p1, result)
  92.     if (INPRO4(p0, result) > 0.0)    VSCALE4(result, -1, result)
  93.     break;
  94.  
  95.     }
  96. }
  97.     
  98.     
  99.     
  100.